package com.结构型模式.桥接模式;

/**桥接模式
 * 通过桥接模式可以让 IAbstract的任意实现类和 Concrete的任意子类随意组合。
 * 桥接（Bridge）模式的定义如下：将抽象与实现分离，使它们可以独立变化。
 * 它是用组合关系代替继承关系来实现，从而降低了抽象和实现这两个可变维度的耦合度。
 * 优点：
 * 抽象与实现分离，扩展能力强
 * 符合开闭原则
 * 符合合成复用原则
 * 其实现细节对客户透明
 * 缺点：
 * 由于聚合关系建立在抽象层，要求开发者针对抽象化进行设计与编程，
 * 能正确地识别出系统中两个独立变化的维度，这增加了系统的理解与设计难度。
 * 实现方法：
 * 抽象化（Abstraction）角色：定义抽象类并包含一个对实现化对象的引用。
 * 扩展抽象化（Refined Abstraction）角色：是抽象化角色的子类，实现父类中的业务方法，并通过组合关系调用实现化角色中的业务方法。
 * 实现化（Implementor）角色：定义实现化角色的类，供扩展抽象化角色调用。
 * 具体实现化（Concrete Implementor）角色：给出实现化角色接口的具体实现。
 * 思考 ：为什么要叫分 抽象化（接口）  和 实现化（类） 这两个角色。？？？？？？？？？？？？？？？？？？？？？？？？？？？
 * 	因为 实现化 中 要将抽象化的·接口当做属性 但是接口和中不能有属性（常量除外）
 * 	那这个接口属性访问限制可以是私有的吗？
 * 	不能的。因为具体实现类的子类要访问他。
 * 	
 * @author chenhs
 * @date 2020/10/14
 */
public class Test {
	public static void main(String[] args) {
		AbstractImplA aa = new AbstractImplA();
		AbstractImplB ab = new AbstractImplB();
		
		ConcreteSonA caAa = new ConcreteSonA(aa);
		caAa.speak();
		ConcreteSonA caAb = new ConcreteSonA(ab);
		caAb.speak();
		ConcreteSonB cbAa = new ConcreteSonB(aa);
		cbAa.speak();
		ConcreteSonB cbAb = new ConcreteSonB(ab);
		cbAb.speak();
	}
}
